﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpVersion_2
{
    class Evolve_T
    {
        public static void Evolve_T_Demo()
        {
            Console.WriteLine("===============数组===============");
            string[] name_1 = GenerateNamesByArray();
            PrintNames(name_1);
            Console.WriteLine();

            Console.WriteLine("===============普通对象集合(ArrayList)===============");
            ArrayList name_2 = GenerateNamesByArrayList();
            PrintNames(name_2);
            Console.WriteLine();

            Console.WriteLine("===============专用类型集合(StringCollection)===============");
            StringCollection name_3 = GenerateNamesByStringCollection();
            PrintNames(name_3);
            Console.WriteLine();

            Console.WriteLine("===============泛型===============");
            List<string> name_4 = GenerateNames();
            PrintNames(name_4);
            Console.WriteLine();
        }

        #region 泛型诞生
        //.NET 1 有如下 3 大类集合:
        //数组 普通对象集合(ArrayList) 专用类型集合(StringCollection___只能接收 String类型的元素)
        //使用上述集合，实现相同方法
        #region 数组
        static string[] GenerateNamesByArray()
        {
            string[] names = new string[4];
            names[0] = "Gamma";
            names[1] = "Vlissides";
            names[2] = "Johnson";
            names[3] = "Helm";
            return names;
        }

        static void PrintNames(string[] names)
        {
            Console.WriteLine("打印数组");
            foreach (string name in names)
            {
                Console.WriteLine(name);
            }
        }
        #endregion

        #region 普通对象集合(ArrayList)
        static ArrayList GenerateNamesByArrayList()
        {
            ArrayList names = new ArrayList();
            names.Add("Gamma");
            names.Add("Vlissides");
            names.Add("Johnson");
            names.Add("Helm");
            return names;
        }
        static void PrintNames(ArrayList names)
        {
            Console.WriteLine("打印普通对象集合(ArrayList)");

            foreach (string name in names)
            {
                Console.WriteLine(name);
            }
        }
        #endregion

        #region 专用类型集合(StringCollection)
        static StringCollection GenerateNamesByStringCollection()
        {
            StringCollection names = new StringCollection();
            names.Add("Gamma");
            names.Add("Vlissides");
            names.Add("Johnson");
            names.Add("Helm");
            return names;
        }
        static void PrintNames(StringCollection names)
        {
            Console.WriteLine("专用类型集合(StringCollection)");

            foreach (string name in names)
            {
                Console.WriteLine(name);
            }
        }
        #endregion

        //如果使用ArrayList，那就等同于舍弃了静态类型的优势。
        //如果传入 StringCollection，那么返回值类型也必须是 StringCollection。
        //String 类型成了该方法输入的要素，于是返回值也被限制到了 String 类型。
        //解决上述问题, string就是这个T，因此List<string>就可以替换所有StringCollection
        //使用 List<T>创建并打印 names
        static List<string> GenerateNames()
        {
            var names = new List<string>();
            names.Add("Gamma");
            names.Add("Vlissides");
            names.Add("Johnson");
            names.Add("Helm");
            return names;
        }

        static void PrintNames(List<string> names)
        {
            Console.WriteLine("打印泛型");
            foreach (string name in names)
            {
                Console.WriteLine(name);
            }
        }
        #endregion
    }
}
